/******************************************************************************
	This file is a part of the Snapshot Bioinformatics Project

	Copyright (C) 2012-2013 Jarom Schow

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#ifndef GZ_FILE_H
#define GZ_FILE_H

#include "BioDefs.h"

#include <QtCore/QIODevice>

namespace Bio {

class BIO_EXPORT GzFile : public QIODevice {
	Q_OBJECT
public:
	GzFile();
	GzFile( const QString &filename, int compressionLevel = 6, int bufferSize = 65536 );
	GzFile( QIODevice *device, int compressionLevel = 6, int bufferSize = 65536 );
	virtual ~GzFile();

	virtual bool	isSequential() const;
	virtual qint64	bytesAvailable() const;
	virtual bool	open( OpenMode mode );
	virtual void	close();
	virtual	void	flush();

	const QIODevice*	getSourceDevice() const;

protected:

	virtual qint64	readData( char *data, qint64 maxSize );
	virtual qint64	writeData( const char *data, qint64 maxSize );

private:

	bool	writeBytes( char *buffer, int outputSize );
	void	flushZlib( int flushMode );
	void	setZlibError( const QString &errorMessage, int zlibErrorCode );

	struct	Data;
	Data	*m_data;
};

}; // Bio

#endif // GZ_FILE_H